/**
 * Copyright 2005 The Apache Software Foundation
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.edi.runtime.component
{
	import com.edi.runtime.Event.EDIDataEvent;
	import com.edi.utils.Constant;
	import com.string.StrUnit;
	
	import flash.events.MouseEvent;
	import flash.external.ExternalInterface;
	import flash.net.URLRequest;
	import flash.net.navigateToURL;
	
	import mx.core.Application;
	import mx.events.FlexEvent;
	import mx.styles.StyleManager;

	/**
	 * 继承自 Application。主要用途：封装了 获取 appName,SessionID,appid的方法，
	 * 同时封装了数据自动分发时所需要使用的EDIDataSource,所有的数据自动分发都通过该EDIDataSource进行数据的分发。 
	 * 
	 */	
	public class EDIApplication extends Application 
	{
		public static var appName:String="KOLA";
		public static var path:String;
		public static var appId:String;
//		public static var sessionId:String;
		public static var self:EDIApplication;
		public static var pageName:String;
		public static var debug:Boolean=false;
		private static var htmlPlanArr:Array=new Array(); 		
		private static var htmlPlanHidden:Array=new Array();
		private static var clientDebug:String="true";
		private static var _ownerObj:Object;
		
		public var caption:String;
		public var ds:EDIDataSource; 
		
//		private static var addPageUrlJS:String=
//			"document.insertScript = function (){" +
//        		"if (document.addPageUrl==null){" + 
//					" addPageUrl=function(url){arr[i++]=url}"
//				"}"+
//			"}";
//		private static var getPageUrlJS:String=
//			"document.insertScript = function (){" +
//        		"if (document.getPageUrl==null)" + 
//        		"{" + 
//					" getPageUrl = function (index){return arr[index!=-1?index:--i]};"
//				"}"+
//			"}";
//		private static var debugJS:String=
//			"document.insertScript = function (){" + 
//				"if(document.setDebugValue==null){"+
//				"var win;"+
//				"setDebugValue = function(value)" + 
//					"{ " + 
//						//"alert('value: '+value);" + 
//						"if(value!=null)" + 
//						"{" + 
//							"if(win == null)" + 
//							"{" +
//								"win=window.open(\""+Constant.debugPage+"\",\"debug\", \"height=100, width=400, toolbar= no, menubar=no, scrollbars=yes, resizable=yes, location=no, status=no,top=100,left=300\");" + 
//							"}" +
//							"try{s=win.document.title;}" + 
//							"catch(err){" + 
//								"win=window.open(\"/kola/debug.html\",\"debug\", \"height=100, width=400, toolbar= no, menubar=no, scrollbars=yes, resizable=yes, location=no, status=no,top=100,left=300\");" + 
//							"}" + 
//							"win.document.write(value+\"<br/>\");" + 
//							"win.document.write(\"----------\"+(new Date()).toLocaleTimeString()+\"----------<br />\");" + 
//							"win.document.body.scrollTop=win.document.body.scrollHeight;" + 
//							"win.focus();" + 
//						"}" + 
//					"}}" + 
//				"}";
		/**
		 * 注册该页面地址到网页中
		 * @param url 网页地址。
		 * 
		 */		
		public static function registerPageUrl(url:String):void
		{
			ExternalInterface.call("addPageUrl",url);
		}
		
		/**
		 * 根据注册时的顺序夺取网页地址 操作如数组取数。 
		 * @param index 注册时的顺序
		 * @return 注册时地址
		 * 
		 */		
		public static function getPageUrl(index:int=-1):String
		{
			return ExternalInterface.call("getPageUrl",index);
		}
		
		/**
		 * 调用javaScript的 history.go 方法
		 * @param index 所指向的索引。
		 * 
		 */		
		public static function historyGo(index:int):void
		{
			ExternalInterface.call("history.go",index);
		}
		
		/**
		 *  调用 javaScript 的history.go（-1）
		 * 
		 */		
		public static function gotoPreviousUrl():void
		{
			historyGo(-1);
		}
		
		/**
		 *	刷新该应用地址。
		 * 
		 */		
		public static function refreshUrl():void
		{
			navigateToURL(new URLRequest(Application.application.url),"_self");
		}
		
		/**
		 *	刷新网页地址。 
		 * 
		 */		
		public static function refreshWebUrl():void
		{
			ExternalInterface.call("window.location.reload()");	
		}
		
		/**
		 *	调用registerPageUrl方法注册本应用地址到页面数组中。 
		 * 
		 */		
		public static function registerThisUrl():void
		{
			registerPageUrl(Application.application.url);
		}
		
		
		/**
		 *  Debug调试器 
		 * @param value 输出的值
		 * @param parse 是否进行字符串替换 将“<”替换成“&lt;”
		 * 
		 */		
		public static function outputDebug(value:String,parse:Boolean=true):void
		{
			//clientDebug
			if(clientDebug=="true")
			{
				if(value!=null)
				{
					if (parse){
						value=StrUnit.replace(value,"<","&lt;");
						value=StrUnit.replace(value,"\n","<br/>");	
						
					}
					
					ExternalInterface.call("setDebugValue",value);
				}
			} 
		}
		
		public function EDIApplication() 
		{  
			super();
			self = this;
			ds=new EDIDataSource(this); 
			addEventListener(EDIDataEvent.Data_RollingBefore,dataRollingHandler);   

			addEventListener(FlexEvent.PREINITIALIZE,preInit);
			this.addEventListener(MouseEvent.CLICK,mouseClickHandler); 
//			ExternalInterface.call(addPageUrlJS);
//			ExternalInterface.call(getPageUrlJS);
			addEventListener(FlexEvent.INITIALIZE,inited);
		}
		
		private function inited(event:FlexEvent):void{
			ExternalInterface.call(Constant.debugJS);
		}
		
		
		private function preInit(event:FlexEvent):void
		{
			
			if(url.indexOf("file://")==-1)
			{
				StyleManager.loadStyleDeclarations(Constant.defaultCSSPath);
			}else{
				StyleManager.loadStyleDeclarations("kola.swf");
			}
			EDIApplication.path=StrUnit.getDomainUrl(StrUnit.getDomainUrl(Application.application.url)+appName+".app");
			if(Application.application.parameters.appId != ""){
				EDIApplication.appId =  Application.application.parameters.appId;
			}
//			if(!(Application.application.parameters.appName == "")){
//				EDIApplication.appName = Application.application.parameters.appName;
//			}	
			
			EDIApplication.pageName=Application.application.parameters.pageName;
			if(Application.application.parameters.clientDebug == ""){
				EDIApplication.clientDebug=Application.application.parameters.clientDebug;
			}
			
		}
		
		/**
		 * 获得该应用所对应的服务地址 
		 * @return 服务的url地址。
		 * 
		 */		
		public static function get url():String
		{
			return path+appName+".app";
		}
		
		/**
		 * 根据应用的URL获得域名，例如:http://www.sina.com.cn/sss/www/aa.html 获得后为http://www.sina.com.cn 
		 * @return 
		 * 
		 */		
		public static function get domainUrl():String
		{
			return com.string.StrUnit.getDomainUrl(path);
		} 
		
		/**
		 * 所关联的EDIDataSource是否自动提交数据 
		 * @param value	Boolean类型,是否自动提交数据true为自动提交。
		 * 
		 */		
		public function set dsCommit(value:Boolean):void{
			//ds.appName=_appName;
			ds.autoCommit=value;
		}
		public function get dsCommit():Boolean{return ds.autoCommit;}
		
		/**
		 * 若应用中存在EDIHTMLPlan类型,则通过该方法将自己进行注册。 
		 * @param htmlPlan EDIHtmlPlan类型的对象。
		 * 
		 */		
		public static function registerHTMLPlan(htmlPlan:EDIHtmlPlan):void
		{
			if(htmlPlanArr.indexOf(htmlPlan)==-1)
			{
				htmlPlanArr.push(htmlPlan);
			}
		}
		/**
		 * 鼠标单击事件监听，使 EDIHTMLEdit失去编辑状态。
		 * @param event
		 * 
		 */		
		private function mouseClickHandler(event:MouseEvent):void
		{
			//单击后焦点移出
			for(var i:int=0;i<EDIApplication.htmlPlanArr.length;i++)
			{
				if(EDIApplication.htmlPlanArr[i] is EDIHTMLEdit)
				{
					if((EDIApplication.htmlPlanArr[i] as EDIHTMLEdit).visible)
					{
						(EDIApplication.htmlPlanArr[i] as EDIHTMLEdit).disabled();
					}
				}
			}
		}
		
		/**
		 * 将当前所有已被注册EDIHTMLPlan类型的visible属性，并将被修改的EDIHTMLPlan对象放入到htmlPlanHidden数组中。
		 * 该方法主要被EDITitleWindow和EDIAlert的show方法调用 
		 * @param value 设置每个EDIHTMLPlan的Visbile的值 
		 * @param ownerObj 是哪个对象或动作进行的设置。
		 * 
		 */		
		public static function setHtmlPlanVisible(value:Boolean,ownerObj:Object):void
		{
			for(var i:int=0;i<htmlPlanArr.length;i++)
			{
				if((htmlPlanArr[i] as EDIHtmlPlan).visible!=value)
				{
					_ownerObj=ownerObj
					htmlPlanHidden.push(htmlPlanArr[i]);
					(htmlPlanArr[i] as EDIHtmlPlan).visible=value;
				}
				
			}

		}
		
		/**
		 *   根据ownerObj来重新设置被该ownerObj通过setHtmlPlanVisible设置的EDIHtmlPlan的visbiel属性的修改。
		 *   并清空htmlPlanHidden数组。可理解为rstoreHtmlPlanVisible是setHtmlPlanVisible的反向操作。
		 *   该方法主要被EDITitleWindow和EDIAlert的Close方法调用
		 * @param value
		 * @param ownerObj
		 * 
		 */		
		public static function rstoreHtmlPlanVisible(value:Boolean,ownerObj:Object):void
		{
			if(_ownerObj==ownerObj)
			{
				for(var i:int=0;i<htmlPlanHidden.length;i++)
				{
					(htmlPlanHidden[i] as EDIHtmlPlan).visible=value;	
				}
				htmlPlanHidden.splice(0,htmlPlanHidden.length);
				_ownerObj=null;
			}
		}
		
		/**
		 *  从htmlPlanHidden中删除该EDIHtmlPlan对象。
		 * @param value EDIHtmlPlan对象。
		 * 
		 */		
		public static function spliceHtmlPlanArr(value:EDIHtmlPlan):void
		{
			for(var i:int=0;i<htmlPlanHidden.length;i++)
			{
				if ((htmlPlanHidden[i] as EDIHtmlPlan)==value)
				{
					htmlPlanHidden.splice(i,1);
					break;
				}	
			}
		}
		
		/**
		 * 监听数据滚动。如：数据指针的向下或向上移动。 
		 * @param event
		 * 
		 */		
		private function dataRollingHandler(event:EDIDataEvent):void
		{
			if(ds.getDataTable(event.tableName)!=null){
				ds.getDataTable(event.tableName).cursorIndex=event.index;
			}
		}
		
		/**
		 *  显示提示对话框，内封装EDIAlertWindow对象。
		 * @param message
		 * @param title
		 * 
		 */		
		public static function alert(message:String,title:String=null):void{
			var alertWindow:EDIAlertWindow = new EDIAlertWindow();
			alertWindow.show(message,self,title);
		}
		
		public static function info(message:String):void{
			alert(message,"信息提示：");
		}
		
		public static function warn(message:String):void{
			alert(message,"警告：");
		}
		
		public static function erro(message:String):void{
			alert(message,"错误：");
		}
	}
}